//
//  YHYNetworkManager.swift
//  微博(学习)
//
//  Created by yhy on 16/11/15.
//  Copyright © 2016年 yhy. All rights reserved.
//

import UIKit



/// Swift 的枚举支持任意数据类型
/// switch / enum OC 中都只支持整数
enum YHYHTTPMethod {
    case GET
    case POST
}


/// 网络管理工具
class YHYNetworkManager: AFHTTPSessionManager {

    /// 静态区/常量/闭包
    /// 在第一次访问时,执行闭包,并且将结果保存在 shared 常量中
    static let shared: YHYNetworkManager = {
        // 实例化对象
        let instance = YHYNetworkManager()
        
        // 设置响应的反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // 返回对象
        return instance
        
    }()
    
    // 用户账户懒加载属性
    lazy var userAccount = YHYUserAccount()
    
    
    
    /// 用户登陆标记[]计算型属性
    public var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: YHYHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool)->()) {
        
        // 处理 token 字典
        // 0> 判断 token 是否为 nil, 为 nil 直接返回, 程序执行过程中, 一般 token 不会为 nil
        guard let token = userAccount.access_token else {
            
            
            print("没有 token! 需要登录")
            
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: YHYUserShouldLoginNotification), object: nil)
            
            completion(nil, false)
            return
        }
        
        // 1> 判断参数字典是存在, 如果为 nil 新建一个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: AnyObject]()
        }
        
        // 2> 设置参数字典,代码在此处,字典一定有值
        parameters!["access_token"] = token as AnyObject?
        
        
        // 调用 request 发起真正的网络请求方法
        request(method: method, URLString: URLString, parameters: parameters, completion: completion)
        
    }
    
    
    
    /// 使用一个函数 封装 AFN 的 GET / POST 请求
    /// 封装AFN的 GET / POST 请求
    ///
    /// - parameter method:     GET / POST
    /// - parameter URLString   URLString
    /// - parameter parameters: 参数字典
    /// - parameter completion: 完成回调[json(数组/字典), 是否成功]
    func request(method: YHYHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool)->()) {
        
        if method == .GET {
          
            get(URLString, parameters: parameters, progress: nil, success: {(task, json) in
                
                completion(json as AnyObject?, true)
                
            }) {(task, error) in
                // 针对 403 处理 token 过期
                // 对应测试用户(应用程序还没有提交给新浪微博审核)每天的刷新量是有限的
                // 超出上限, token 会被锁定一段时间
                // 解决办法,新建一个应用程序
                if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                   
                    print("token过期")
                    
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: YHYUserShouldLoginNotification), object: "bad token")
                    
                }
                
                
                print("网络请求错误 \(error)")
                
                completion(nil, false)
                
            }
            
        }else {
            post(URLString, parameters: parameters, progress: nil, success: { (task, json) in
                completion(json as AnyObject?, true)
            }, failure: { (task, error) in
                print("网络请求错误 \(error)")
                completion(nil, false)
            })
        }
        
        
    }
    
}
